package com.softeem.dromitorysystem.controller;

import cn.hutool.core.util.DesensitizedUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.softeem.dromitorysystem.dto.Result;
import com.softeem.dromitorysystem.entity.Manager;
import com.softeem.dromitorysystem.service.ManagerService;
import com.softeem.dromitorysystem.service.impl.ManagerServiceImpl;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Objects;

//控制器
@Tag(name = "管理员管理",description = "对于管理员的相关访问操作，如：登录，添加，信息更新，列表查询，删除等")
@RestController
public class ManagerController {
    //定义业务层的对象
    @Autowired
    private ManagerService managerService;

    /**
     * 登录
     * @param manager
     * @return
     */
    @Operation(summary = "管理员登录",description = "需要提供管理员的账号和密码信息")
    @GetMapping(value = "/manager/login")
    public Result login(@Parameter(description = "管理员对象") Manager manager){
        return managerService.login(manager);
    }

    /**
     * 注册
     * @param manager
     * @return
     */
    @Operation(summary = "管理员添加",description = "至少需要提供账号和密码信息")
    @PostMapping("/manager/reg")
    public Result reg(@Parameter(description = "管理员对象") Manager manager) {
        return managerService.reg(manager);
    }

    /**
     * 管理员信息修改
     * @param manager
     * @return
     */
    @Operation(summary = "管理员信息更新",description = "根据id修改密码或状态，id必须提供")
    @PutMapping("/manager/update")
    public Result modify(@Parameter(description = "管理员对象") Manager manager){
        //判断是否需要改密码
        if(Objects.nonNull(manager.getPassword())){
            //生成盐
            String salt = RandomUtil.randomString(6);
            //使用盐
            String pwd = SecureUtil.md5(salt + manager.getPassword());
            //将新密码和随机盐添加到对象中
            manager.setPassword(pwd);
            manager.setSalt(salt);
        }
        //执行修改
        if (managerService.updateById(manager)){
            return Result.ok().setMsg("修改成功").setData(manager);
        }
        return Result.fail().setMsg("更新失败");
    }

    /**
     * 管理员列表 132*****2339（脱敏）
     * @return
     */
    @Operation(summary = "查询所有管理员",description = "显示所有管理员信息，其中密码随机盐做脱敏处理")
    @GetMapping("/manager/listAll")
    public Result list(){
        //查询所有管理员
        List<Manager> list = managerService.list();
        if (list.isEmpty()){
            return Result.fail().setMsg("无记录");
        }
        list.forEach(manager -> {
            //取出密码脱敏后重新填充到密码属性中
            manager.setPassword(DesensitizedUtil.password(manager.getPassword()));
            manager.setSalt(DesensitizedUtil.password(manager.getSalt()));
        });
        return Result.ok().setMsg("查询成功").setData(list);
    }

    /**
     * 分页查询
     * @param page 当前显示的页码数
     * @param limit 每页数据条目数
     * @return
     */
    @Operation(summary = "分页查询管理员",description = "显示所有管理员信息，其中密码随机盐做脱敏处理")
    @Parameters({
            @Parameter(name = "page",description = "当前页",required = true),
            @Parameter(name = "limit",description = "每页数据条目数",required = true)})
    @GetMapping("/manager/list")
    public Result list(Integer page,Integer limit){
        //执行分页查询
        List<Manager> list = managerService.list(new Page<>(page,limit));
        if (list.isEmpty()){
            return Result.fail().setMsg("无记录");
        }
        list.forEach(manager -> {
            //取出密码,盐脱敏后重新填充到密码属性中
            manager.setPassword(DesensitizedUtil.password(manager.getPassword()));
            manager.setSalt(DesensitizedUtil.password(manager.getSalt()));
        });
        return Result.ok().setMsg("查询成功").setData(list);
    }

    /**
     * 根据id删除管理员（物理删除：谨慎操作）
     * @param id
     * @return
     */
    @Operation(summary = "删除管理员",description = "物理删除，根据id删除管理员信息，谨慎操作")
    @DeleteMapping("/manager/{id}")
    public Result delById(@PathVariable ("id") Integer id){
        Manager manager = managerService.getById(id);
        if (Objects.isNull(manager)){
            return Result.fail().setMsg("该管理员不存在或者已经被删除!");
        }
        if (managerService.removeById(id)){
            return Result.ok().setMsg("删除成功");
        }
        return Result.fail().setMsg("删除失败");
    }
}
